Configuring resources in complex and multiple computing environments such as in various stages of the deployment of software in a distributed computing environment is complex and challenging. In many cases, resource configuration changes such as creation and update of computing environments, monitors, and resources are manually created and updated by engineers. This process may be error-prone, resulting in inconsistencies in configurations between various environments, and may even result in deployment failures, such as where dependencies between resources may vary between different computing environments.
As a result, engineers can spend several days configuring the systems and services needed to host even a simple service. Further, once deployed, updating an application, changing the configuration of the underlying systems and services, or deploying the application to additional systems or locations can also require substantial amounts of engineer time. For example, assume an enterprise wants to deploy a retail shopping website, where the website is backed by web-servers, application servers, and database applications deployed using services offered by a computing resource service provider. In many cases, engineers will manually configure and provision a variety of virtual machine instances (or classes of instances) with the desired web and application server applications, provide the content for these systems, configure network addresses, configure database and storage services, provision security mechanisms (e.g., provisioning SSL certificates on all public facing systems), configure administrative and role based access controls, configure and launch load balancing systems, scaling groups, as well as configure monitoring, logging, and reporting applications. Once deployed, adding features or updating the software used to provide a public facing service (e.g., the retail web site) can require similar levels of configuration and provisioning.